package impl

import (
	"context"
	"fmt"

	"gitee.com/go-kade/go12/vblog/apps/user"
	"gitee.com/go-kade/go12/vblog/conf"
	"gitee.com/go-kade/go12/vblog/exception"
	"gitee.com/go-kade/go12/vblog/ioc"
	"gorm.io/gorm"
)

// 导入这个包的时候，直接把这个对象 UserServiceImpL 注册给IocUserService ioc
// 注册user业务模块(业务模块的名称是user.AppName)的控制器
func init() {
	ioc.Controller().Registry(&UserServiceImpl{})
}

// 显示声明接口实现的语言 都可以 明确约束接口的实现
// var _ user.Service = &UserServiceImpl{}

var _ user.Service = (*UserServiceImpl)(nil) //装逼的写法

type UserServiceImpl struct {
	db *gorm.DB
}

// 都需要在配置初始化后进行调用
func NewUserServiceImpl() *UserServiceImpl { //给db初始化
	// db 怎么来?
	// 通过配置 https://gorm.io/zh_CN/docs/index.html
	return &UserServiceImpl{
		// 开启Debug模式
		db: conf.C().MySQL.GetConn().Debug(),
	}
}

// 定义对象的初始化
func (i *UserServiceImpl) Init1() error {
	i.db = conf.C().MySQL.GetConn().Debug()
	return nil
}

// 定义托管到Ioc里面的名称
func (i *UserServiceImpl) Name() string {
	return user.AppName
}

func (i *UserServiceImpl) CreateUser(ctx context.Context, req *user.CreateUserRequest) (*user.User, error) {
	if err := req.Validate(); err != nil {
		return nil, err
	}
	fmt.Println("------------------")
	// req = user.NewCreateUserRequest()
	// req.Username = "admin"
	// req.Password = "123456"
	ins := user.NewUser(req)
	i.db.Model(&user.User{}).Create(ins)
	// type User struct {
	// 	gorm.Model // 添加默认的模型字段（ID、CreatedAt、UpdatedAt、DeletedAt）
	// 	Username   string
	// 	Email      string
	// }
	// db, _ := gorm.Open(mysql.Open("root:cys000522@tcp(34.28.164.10:3306)/go12?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{})
	// db.AutoMigrate(User{})
	// db := conf.C().MySQL.GetConn()
	// err := db.AutoMigrate(User{})
	// if err != nil {
	// 	log.Fatal("Failed to migrate User table")
	// }
	return ins, nil
}

func (i *UserServiceImpl) DeleteUser(ctx context.Context, req *user.DeleteUserRequest) error {
	_, err := i.QueryUser(ctx, user.NewQueryUserRequestID(fmt.Sprintf("%d", req.Id)))
	if err != nil {
		return err
	}

	return i.db.WithContext(ctx).Where("id= ?", req.Id).Delete(&user.User{}).Error
}

func (i *UserServiceImpl) QueryUser(ctx context.Context, req *user.QueryUserRequest) (*user.User, error) {
	query := i.db.WithContext(ctx)
	switch req.QueryUserBy {
	case user.Query_UserBy_Id:
		query = query.Where("id = ?", req.QueryUserByUsername)
	case user.Query_UserBy_Username:
		query = query.Where("username = ?", req.QueryUserByUsername)
	}
	c := user.NewUser(user.NewCreateUserRequest())
	if err := query.First(c).Error; err != nil {
		if err == gorm.ErrRecordNotFound {
			// if exception.IsNotFound1(err) {
			// fmt.Println(exception.NewAuthFound("cccccccc").Error())
			return nil, exception.NewNotFound("user %s not founds", req.QueryUserByUsername)
			// }
		}
		return nil, err
	}
	// 数据库存的就是hash，下面作用不大，以防万一
	c.SetIsHashed()
	return c, nil
}

// func CreateUser(ctx context.Context, req *user.CreateUserRequest) (*user.User, error) {
// 	if req.Username == "" || req.Password == "" {
// 		return nil, fmt.Errorf("用户名或者密码需要填写")
// 	}
// 	return nil, nil
// }
